package ar.uba.dc.sistemas.monitorRW;

/**
 * Implementacion del Monitor
 * Que no da preferencias a lectores o escritores 
 * Es equivalente a un semaforo.
 * Permite una sola lectura y escritura por vez.
 *
 * @author Hernan Berroja Albiz / German del Tuffo
 * @version 0.1
 */

public class SingleReaderWriter implements MultipleReadersWritersMonitor {
    /**
     * cantidad de lectores leyendo y escritores escribiendo, 0 o 1.
     */
    protected int cantLectores = 0;

    /**
     * Resetea el monitor.
     */
    public void reset() {
        cantLectores = 0;
    }

    /**
     * Este metodo es llamado para comenzar a leer el objeto compartido.
     */
    public synchronized void comenzarLectura()
            throws InterruptedException {
        while (cantLectores != 0) wait();
        cantLectores = 1;
    }

    /**
     * Este metodo es llamado luego de terminar de leer el objeto compartido
     */
    public synchronized void detenerLectura() {
        cantLectores = 0;
        notify();
    }

    /**
     * Este metodo es llamado para comenzar a escribir el objeto compartido.
     */
    public synchronized void comenzarEscritura()
            throws InterruptedException {
        while (cantLectores != 0) wait();
        cantLectores = 1;
    }

    /**
     * Este metodo es llamado cuando se termina de escribir en el objeto compartido
     */
    public synchronized void detenerEscritura() {
        cantLectores = 0;
        notify();
    }

    /**
     * Este metodo brinda informacion acerca del monitor.
     */
    public String getMonitorInfo() {
        return "Single Reader Writer Monitor";
    }
}
